package com.sky.aspect;

import com.sky.annotation.AutoRefreshRedis;
import com.sky.constant.StatusConstant;
import com.sky.entity.Dish;
import com.sky.result.Result;
import com.sky.vo.DishVO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Aspect
@Component
@Slf4j
public class AutoRefreshRedisAspect {

    @Autowired
    RedisTemplate redisTemplate;

    @Pointcut("execution(* com.sky.controller.admin.*.*(..)) && @annotation(com.sky.annotation.AutoRefreshRedis)")
    public void autoRefreshRedisPointCut() {}

    @AfterReturning("autoRefreshRedisPointCut()")
    public void clearAllRedisCaches() {
    Set keys = redisTemplate.keys("dish_*");
    redisTemplate.delete(keys);

    }


    private void allDeleteRedisCaches() {
        // 获取 RedisTemplate 的连接工厂，这是与 Redis 服务器建立连接的基础
        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();

        try {
            // 使用 RedisConnection 的 flushDb() 方法来清除当前数据库中的所有键
            // 注意：这里的 "当前数据库" 是指 Redis 启动时默认选择的数据库（通常是 DB 0）
            // flushDb() 是一个 Redis 命令，它会立即清除当前数据库中的所有键，而不做任何数据备份
            connection.flushDb();

            // 如果你想要清除所有数据库中的所有键，可以使用 flushAll() 方法
            // 注意：flushAll() 不仅会清除当前数据库中的所有键，还会清除所有其他数据库中的所有键
            // 这个操作非常强大，也非常危险，因为它会无差别地清除所有数据
            // connection.flushAll();

        } finally {
            // 确保在操作完成后关闭连接，这
            // 是良好的资源管理习惯
            // 关闭连接有助于释放系统资源，防止资源泄漏
            connection.close();
        }
    }
}
